# -*- coding: utf-8 -*-
"""
@Time ： 2023/10/22 0:39
@Auth ： y.h
@File ：system_test.py
@IDE ：PyCharm
@Motto：The sooner you start to code, the longer the program will take. —— Roy Carlson
"""
import numpy
import pandas
import pytest

from pythonProjectTemplate.Controller.configurator_controller import 配置器
from pythonProjectTemplate.Controller.file_controller import 文件操作
from pythonProjectTemplate.Controller.numpy_calculation_controller import 矩阵运算
from pythonProjectTemplate.Controller.pandas_data_controller import 数据操作
from pythonProjectTemplate.Controller.pandas_query_controller import pandas数据筛查


class TestFileController():

    def test_pandas_load_excel_01(self):
        表单配置列表 = []
        set_excel_properties_1 = (配置器().读取Excel表单配置()
                                  .配置表单名("BOM清单")
                                  .跳过指定的行(1)
                                  .配置读取前几行(None)
                                  .配置读取的列(None))

        set_excel_properties_2 = (配置器().读取Excel表单配置()
                                  .配置表单名("价格清单")
                                  .跳过指定的行(None)
                                  .配置读取前几行(None)
                                  .配置读取的列(None))

        set_excel_properties_3 = (配置器().读取Excel表单配置()
                                  .配置表单名("单车成本计算")
                                  )
        set_excel_properties_4 = (配置器().读取Excel表单配置()
                                  .配置表单名("Sheet1")

                                  )

        表单配置列表.append(set_excel_properties_1)
        表单配置列表.append(set_excel_properties_2)
        表单配置列表.append(set_excel_properties_3)
        表单配置列表.append(set_excel_properties_4)

        文件地址 = r"C:\Users\31951\Desktop\请自定义名称\数据文件夹\技能大赛Python数据集.xlsx"

        file = 配置器().文件加载配置().配置Excel文件(文件地址, 表单配置列表)

        源数据 = 文件操作().pandas加载Excel(file)
        assert type(源数据) == type(dict())
        return 源数据

    def test_pandas_load_excel_02(self):
        # todo 这里测出来一个数组指针越界错误,有空研究一下
        表单配置列表 = []
        set_excel_properties_1 = (配置器().读取Excel表单配置()
                                  .配置表单名("BOM清单")
                                  .跳过指定的行(1)
                                  .配置读取前几行(100)
                                  .将指定的文本转为False("零件1")
                                  .将指定的文本转为True("零件2")
                                  # .指定列的数据类型({"SZHBG-2025": "float"})
                                  .指定引擎解析Excel(None)
                                  .指定某些列的某些值为NaN({"零件名称": "零件3"})
                                  .配置读取的列([6, 7, 8]))

        set_excel_properties_2 = (配置器().读取Excel表单配置()
                                  .配置表单名("价格清单")
                                  .跳过指定的行(None)

                                  .配置读取前几行(None)
                                  .配置读取的列(None)
                                  .配置读取的列(None))

        set_excel_properties_3 = (配置器().读取Excel表单配置()
                                  .配置表单名("单车成本计算")
                                  )
        set_excel_properties_4 = (配置器().读取Excel表单配置()
                                  .配置表单名("Sheet1")

                                  )

        表单配置列表.append(set_excel_properties_1)
        表单配置列表.append(set_excel_properties_2)
        表单配置列表.append(set_excel_properties_3)
        表单配置列表.append(set_excel_properties_4)

        文件地址 = r"C:\Users\31951\Desktop\请自定义名称\数据文件夹\技能大赛Python数据集.xlsx"

        file = 配置器().文件加载配置().配置Excel文件(文件地址, 表单配置列表)

        源数据 = 文件操作().pandas加载Excel(file)
        assert type(源数据) == type(dict())

    def test_openpyxl_load_excel(self):
        表单配置列表 = []
        set_excel_properties_1 = (配置器().读取Excel表单配置()
                                  .配置表单名("BOM清单")
                                  .跳过指定的行(1)
                                  .配置读取前几行(None)
                                  .配置读取的列(None))

        set_excel_properties_2 = (配置器().读取Excel表单配置()
                                  .配置表单名("价格清单")
                                  .跳过指定的行(None)
                                  .配置读取前几行(None)
                                  .配置读取的列(None))

        set_excel_properties_3 = (配置器().读取Excel表单配置()
                                  .配置表单名("单车成本计算")
                                  )
        set_excel_properties_4 = (配置器().读取Excel表单配置()
                                  .配置表单名("Sheet1")

                                  )

        表单配置列表.append(set_excel_properties_1)
        表单配置列表.append(set_excel_properties_2)
        表单配置列表.append(set_excel_properties_3)
        表单配置列表.append(set_excel_properties_4)

        文件地址 = r"C:\Users\31951\Desktop\请自定义名称\数据文件夹\技能大赛Python数据集.xlsx"

        file = 配置器().文件加载配置().配置Excel文件(文件地址, 表单配置列表)

        源数据 = 文件操作().openpyxl加载Excel(file)
        assert type(源数据) == type(dict())


class TestNumpyCalculation():
    def test_pandas_and_numpy_conversion(self):
        data = TestFileController().test_pandas_load_excel_01()
        np = 矩阵运算().pandas与numpy矩阵数组转换(data.get("技能大赛Python数据集").get("价格清单"))
        assert type(np) == type(numpy.array(1))
        pd = 矩阵运算().pandas与numpy矩阵数组转换(np)
        assert type(pd) == type(pandas.DataFrame())

    def test_many_col_and_row_iter_calculation(self):
        data = TestFileController().test_pandas_load_excel_01()
        矩阵运算配置 = (配置器().多列多行迭代运算配置().配置运算符(配置器().运算符().乘)
                        .配置数据集1(data.get("技能大赛Python数据集").get("BOM清单"))
                        .配置表1列索引(5)
                        .配置表2列索引(3)
                        .配置数据集2(data.get("技能大赛Python数据集").get("价格清单")))

        result = 矩阵运算().多行与多列迭代运算(矩阵运算配置)
        assert result is not None

    def test_many_row_and_row_calculation(self):
        data = TestFileController().test_pandas_load_excel_01()
        pro = (配置器().多行与多行迭代运算配置()
               .配置数据集1(data.get("技能大赛Python数据集")
                            .get("BOM清单")).配置运算符(配置器().运算符().乘)
               .配置数据集1列索引(6)
               .配置数据集1起始行(5)
               .配置数据集1截止行(20)
               .配置数据集2(data.get("技能大赛Python数据集").get("BOM清单"))
               .配置数据集2列索引(5).配置数据集2截止行(100).配置数据集2起始行(50))
        result = 矩阵运算().多行与多行迭代运算(pro)
        assert result is not None

    def test_single_valued_matrix_calculation(self):
        data = TestFileController().test_pandas_load_excel_01()
        pro = (配置器().单值矩阵运算配置()
               .配置运算符(配置器().运算符().乘)
               .配置数据集(data.get("技能大赛Python数据集").get("BOM清单"))
               .配置数据集起始行(20).配置数据集截止行(60).配置索引列(7).配置运算单值(50))
        result = 矩阵运算().单值矩阵运算(pro)
        print(result)
        assert result is not None


class TestPandasQueryController():
    def test_data_deduplication(self):
        data = TestFileController().test_pandas_load_excel_01()

        数据查重配置文件 = (配置器().数据查重配置()
                            .配置文件名("技能大赛Python数据集")
                            .配置表单名("价格清单")
                            .配置列索引(["序号"]))
        result = pandas数据筛查().数据查重(data, [数据查重配置文件])
        print("------------->>>>>>  数据集查重")
        print(result)
        assert result is not None

    def test_get_sheet_data(self):
        data = TestFileController().test_pandas_load_excel_01()
        数据截取配置文件_1 = (配置器().数据裁切配置()
                              .配置文件名("技能大赛Python数据集")
                              .配置表单名("BOM清单")
                              .配置列索引([1, 2, 3]))
        col_data = pandas数据筛查().数据截取(data, 数据截取配置文件_1)

        数据截取配置文件_2 = (配置器().数据裁切配置()
                              .配置文件名("技能大赛Python数据集")
                              .配置表单名("BOM清单")
                              .配置数据裁切起始行(3)
                              .配置数据裁切截止行(50)
                              .配置数据裁切起始列(0)
                              .配置数据裁切截止列(10))
        begin_end_data = pandas数据筛查().数据截取(data, 数据截取配置文件_2)
        print("--------------->>>>>> 数据列截取数据")
        print(col_data)
        print("----------->>>>>>>>>> 数据起始截止值截取数据")
        print(begin_end_data)

        assert col_data is not None
        assert begin_end_data is not None

    def test_table_merge(self):
        data = TestFileController().test_pandas_load_excel_01()
        表合并后数据 = pandas数据筛查().合并表([data.get("技能大赛Python数据集").get("BOM清单"),
                                                data.get("技能大赛Python数据集").get("价格清单")],
                                               ["零件编号"],
                                               "inner")

        print("-------------->>>>>>  表合并测试")
        print(表合并后数据)
        assert 表合并后数据 is not None

    def test_query_col_value(self):
        data = TestFileController().test_pandas_load_excel_01()
        result = pandas数据筛查().指定列值筛查(df=data.get("技能大赛Python数据集").get("BOM清单"),
                                               col_value="零件名称",
                                               value_list=["零件1"])
        print("---------->>>>>>>>>>指定列值筛查")
        print(result)

        assert result is not None

    def test_condition_query(self):
        data = TestFileController().test_pandas_load_excel_01()
        result = pandas数据筛查().条件查询(data.get("技能大赛Python数据集").get("BOM清单"),
                                           query_condition="df['序号'] == 10")

        print("-------------->>>>>>>>>>>>  条件查询")
        print(result)

        assert result is not None

    def test_get_row_count(self):
        data = TestFileController().test_pandas_load_excel_01()
        result = pandas数据筛查().获取行数(data.get("技能大赛Python数据集").get("BOM清单"))

        print("---------------->>>>>>>>>> 获取行数")
        print(result)

        assert result is not None

    def test_get_col_count(self):
        data = TestFileController().test_pandas_load_excel_01()
        result = pandas数据筛查().获取行数(data.get("技能大赛Python数据集").get("BOM清单"))

        print("-------------->>>>>>>>  获取列数")
        print(result)

        assert result is not None

    def test_data_group_by_query(self):
        data = TestFileController().test_pandas_load_excel_01()
        result = pandas数据筛查().分组查询(data.get("技能大赛Python数据集").get("BOM清单"), group_col_name="供应商")
        print("--------------->>>>>  分组查询")
        print(result)

        assert result is not None

    def test_fuzzy_query(self):
        data = TestFileController().test_pandas_load_excel_01()
        result = pandas数据筛查().模糊查询(data.get("技能大赛Python数据集").get("BOM清单"), col_name="零件名称",
                                           like_value="99")


        print("------------->>>>>>>>> 模糊查询")
        print(result)
        print(type(result))
        assert result is not None


class Test_pandas_data_controller():
    def test_condition_del_col_or_line(self):
        data = TestFileController().test_pandas_load_excel_01()
        del_row = 数据操作().按照条件删除指定数据(data.get("技能大赛Python数据集").get("价格清单"),
                                                         "df['序号'] == 'test'")

        del_col = 数据操作().按照条件删除指定数据(data.get("技能大赛Python数据集").get("价格清单"),
                                                         "df['序号'] == 'test'",is_line=False)

        print("---------->>>>>>>>>>> 行删除")
        print(del_row)

        print("------------->>>>>>>>  列删除")
        print(del_col)

        assert del_row is not None
        assert del_col is not None

    def test_calculating_multiple_columns(self):
        data = TestFileController().test_pandas_load_excel_01()
        表合并后数据 = pandas数据筛查().合并表([data.get("技能大赛Python数据集").get("BOM清单"),
                                                data.get("技能大赛Python数据集").get("价格清单")],
                                               ["零件编号"],
                                               "inner")

        多列运算配置 = (配置器().多列运算配置()
                        .配置数据集(表合并后数据)
                        .配置文件名("技能大赛Python数据集")
                        .配置表名("BOM清单")
                        #   [{"key":"value"},....]  SZHBG-2023_multiply_零件价格1
                        .配置第一个参数(["SZHBG-2023",
                                         "SZHBG-2024",
                                         "SZHBG-2025",
                                         "SZHBG-2026",
                                         "SZHBG-2027",
                                         "SZHBG-2028",
                                         "SZHBG-2029",
                                         "SZHBG-2030",
                                         "SZHBG-2031",
                                         "SZHBG-2032",
                                         "SZHBG-2033",
                                         "SZHBG-2034",
                                         "SZHBG-2035",
                                         "SZHBG-2036",
                                         "SZHBG-2037",
                                         "SZHBG-2038",
                                         "SZHBG-2039",
                                         "SZHBG-2040",
                                         ])
                        .配置第二个参数(["零件价格"])
                        .配置运算符(配置器().运算符().乘))

        result = 数据操作().多列运算(多列运算配置)

        print("-------->>>>>>>>> 多列运算")
        print(result)

        assert result is not None

    def test_col_or_line_sum(self):
        data = TestFileController().test_pandas_load_excel_01()

        result = 数据操作().指定行或列求和(data.get("技能大赛Python数据集").get("BOM清单"), 5, 10, "", flag=False)
        print("--------------->>>>>>  指定行或列求和")
        print(result)

        assert result is not None

    def test_col_row_conversion(self):
        data = TestFileController().test_pandas_load_excel_01()

        result = 数据操作().行列转换(data.get("技能大赛Python数据集").get("BOM清单"))
        print("----------->>>>>>  行列转换数据")
        print(result)

        assert result is not None

    def test_re_col_name(self):
        # 免测
        assert True

    def test_update_col(self):
        data = TestFileController().test_pandas_load_excel_01()
        result = 数据操作().新增列(data.get("技能大赛Python数据集").get("BOM清单"),pandas数据筛查().获取列数(data.get("技能大赛Python数据集").get("BOM清单")),"test",[])

        print("--------->>>>>> 新增列")
        print(result)
        assert result is not None

# TODO 时间不够,先不测,用的时候出问题再改






if __name__ == '__main__':
    pytest.main(["-s", r"C:\Users\31951\Desktop\请自定义名称\system_test.py"])
